/**
* Project Name:KettleUtil
* Date:2016年6月21日
* Copyright (c) 2016, jingma All Rights Reserved.
*/

package cn.benma666.kettle.mytuils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map.Entry;
import java.util.Properties;

import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.pentaho.di.core.database.util.DatabaseUtil;

import cn.benma666.constants.UtilConst;
import cn.benma666.exception.MyException;
import cn.benma666.iframe.Conf;
import cn.benma666.iframe.JSONObjectConf;
import cn.benma666.myutils.Log;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.fastjson.JSONObject;

/**
 * 数据库操作类 <br/>
 * date: 2016年6月21日 <br/>
 * @author jingma
 * @version 
 */
public class Db extends cn.benma666.sjzt.Db{
    /**
    * 获取数据库操作对象 <br/>
    * @author jingma
    * @param dbCode
    * @return
    */
    public static Db use(String dbCode) {
        if(!UtilConst.DEFAULT.equals(dbCode)){
            try {
                use();
            } catch (MyException e) {
                //先尝试连接默认数据源，便于后续获取字典等信息
                use(UtilConst.DEFAULT);
            }
        }
        Db ndb;
        //先获取自有数据源，找不到在尝试simplejndi
        cn.benma666.sjzt.Db tdb = cn.benma666.sjzt.Db.use(dbCode);
        DataSource dataSource = null;
        if(tdb==null){
            try {
                initConfig();
                dataSource = DatabaseUtil.getDataSourceFromJndi( dbCode, new InitialContext() );
                ndb = new Db(dbCode,dataSource);
            } catch (Exception e) {
                //只需在jndi中配置sjsj数据库即可，其他数据源使用myservice中配置的数据源
                Log.getLogger().debug("获取JNDI数据源失败", e);
                throw new MyException("获取数据源失败",e);
            }
        }else{
            ndb = new Db();
            ndb.setDataSource(tdb.getDataSource());
            ndb.setSqlManager(tdb.getSqlManager());
            ndb.setDbType(tdb.getDbType());
        }
        return ndb;
    }
    /**
    * 初始化配置 <br/>
    * @author jingma
    */
    private static void initConfig() {
        try {
            Conf.getConfig();
            //配置已经设置
            return;
        } catch (MyException e1) {
        }
        //设置初始配置信息
        Properties properties = new Properties();
        InputStream in = null;
        try {
            //主动读取kettle的配置文件
            in = new FileInputStream(System.getProperty("KETTLE_HOME")+"/.kettle/kettle.properties");
            properties.load(in);
        } catch (Exception e) {
            throw new MyException("读取配置失败",e);
        }finally{
            if(in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    throw new MyException("读取配置失败",e);
                }
            }
        }
        JSONObject config = new JSONObject();
        for(Entry<Object, Object> e:properties.entrySet()){
            config.put(e.getKey().toString(), e.getValue());
        }
        //设置加载配置的字典类别
        config.put(Conf.CONFIG_LIST, "SYS_COMMON_APPCONFIG,SYS_KP_APPCONFIG");
        Conf.setConfig(new JSONObjectConf(config));
    }
    /**
     * Creates a new instance of Db.
     */
    private Db() {
    }
    public Db(String dbCode,DataSource dataSource) {
        super(dbCode, (DruidDataSource) dataSource);
    }
}
